﻿const MULTI_CHAT = "群发消息"        // 群发消息标志
const SERVER_IP = "192.168.1.108"   // 服务器 IP 地址
const SERVER_PORT = 5000            // 服务器端口号

/**
 * 协议的构造方法。
 */
function _ImProtocol() {
}

const ImProtocol = new _ImProtocol()    // 协议

// 协议类型
const ProtocolType = {
    ADD_FRIEND_REQUEST: 1,  // 添加好友请求
    ADD_FRIEND_RESULT: 2,   // 添加好友结果
    CHAT: 3,                // 聊天
    FRIEND_LOGON: 4,        // 好友登录
    LOGOFF: 5,              // 离线
    LOGON: 6,               // 登录
    REG: 7                  // 注册
}

// 结果码
const ResultCode = {
    ADD_FRIEND_ALLOW: 0,            // "添加{0}为好友成功。"
    ADD_FRIEND_NOT_ALLOW: 1,        // "拒绝和你成为好友。"
    ALREADY_BE_FRIENDS: 2,          // "已经是你的好友了。"
    FRIEND_NAME_EQUAL_SELF_NAME: 3, // "好友名字与自己名字相同。"
    LOGON_SUCCEEDED: 4,             // "登录成功。"
    NETWORK_ERROR: 5,               // "连接服务失败，请参考使用说明。"
    PASSWORD_WRONG: 6,              // "密码不正确。"
    REG_SUCCEEDED: 7,               // "注册成功。"
    SUCCEEDED: 8,                   // ""
    TOO_MANY_FRIENDS: 9,            // "朋友太多了，不能再继续添加了。"
    USER_ALREADY_LOGON: 10,         // "该用户已经登录了。"
    USER_EXISTS: 11,                // "该用户名已经被注册了。"
    USER_NOT_FOUND: 12              // "该用户尚未注册。"
}

/*
 * 添加好友请求的构造方法。
 * @param dstUsername   目标用户名
 * @param srcIconIndex  源用户头像索引
 * @param srcUsername   源用户名
 */
function AddFriendRequest(dstUsername, srcIconIndex, srcUsername) {
    this.mDstUsername = dstUsername                 // 目标用户名
    this.mSrcIconIndex = srcIconIndex               // 源用户头像索引
    this.mSrcUsername = srcUsername                 // 源用户名
    this.mType = ProtocolType.ADD_FRIEND_REQUEST    // 协议类型
}

/**
 * 添加好友结果的构造方法。
 * @param dstIconIndex  目标用户头像索引
 * @param dstUsername   目标用户名
 * @param resultCode    结果码
 * @param srcUsername   源用户名
 */
function AddFriendResult(dstIconIndex, dstUsername, resultCode, srcUsername) {
    this.mDstIconIndex = dstIconIndex               // 目标用户头像索引
    this.mDstUsername = dstUsername                 // 目标用户名
    this.mResultCode = resultCode                   // 结果码
    this.mSrcUsername = srcUsername                 // 源用户名
    this.mType = ProtocolType.ADD_FRIEND_RESULT     // 协议类型
}

/**
 * 聊天信息的构造方法。
 * @param content       内容
 * @param dstUsername   目标用户名
 * @param srcUsername   源用户名
 * @param time          生成时间
 */
function ChatInfo(content, dstUsername, srcUsername, time) {
    this.mContent = content             // 内容
    this.mDstUsername = dstUsername     // 目标用户名
    this.mSrcUsername = srcUsername     // 源用户名
    this.mTime = time                   // 生成时间
    this.mType = ProtocolType.CHAT      // 协议类型
}

/**
 * 好友登录通知的构造方法。
 * @param username  用户名
 */
function FriendLogon(username) {
    this.mType = ProtocolType.FRIEND_LOGON  // 协议类型
    this.mUsername = username               // 用户名
}

/**
 * 离线请求的构造方法。
 * @param username  用户名
 */
function LogoffRequest(username) {
    this.mType = ProtocolType.LOGOFF    // 协议类型
    this.mUsername = username           // 用户名
}

/**
 * 登录请求的构造方法。
 * @param password  密码
 * @param username  用户名
 */
function LogonRequest(password, username) {
    this.mType = ProtocolType.LOGON                         // 协议类型
    this.mUserInfo = new UserInfo(0, password, username)    // 用户信息
}

/**
 * 登录结果的构造方法。
 */
function LogonResult() {
    this.mFriendCount = 0                       // 好友数
    this.mFriends = null                        // 好友名列表
    this.mFriendsOnline = null                  // 好友在线状态列表
    this.mIconIndex = -1                        // 头像索引
    this.mResultCode = ResultCode.SUCCEEDED     // 结果码
    this.mType = ProtocolType.LOGON             // 协议类型
}

/*
 * 注册请求的构造方法。
 * @param iconIndex 头像索引
 * @param password  密码
 * @param username  用户名
 */
function RegRequest(iconIndex, password, username) {
    this.mType = ProtocolType.REG                                   // 协议类型
    this.mUserInfo = new UserInfo(iconIndex, password, username)    // 用户信息
}

/*
 * 注册结果的构造方法。
 */
function RegResult() {
    this.mResultCode = ResultCode.SUCCEEDED     // 结果码
    this.mType = ProtocolType.REG               // 协议类型
}

/**
 * 用户信息类的构造方法。
 * @param iconIndex 头像索引
 * @param password  密码
 * @param username  用户名
 */
function UserInfo(iconIndex, password, username) {
    this.mIconIndex = iconIndex     // 头像索引
    this.mPassword = password       // 密码
    this.mUsername = username       // 用户名
}

if (typeof module != "undefined") {
    exports = module.exports = {
        ImProtocol,
        SERVER_IP,
        SERVER_PORT,
        MULTI_CHAT,
        ProtocolType,
        ResultCode,
        AddFriendRequest,
        AddFriendResult,
        ChatInfo,
        FriendLogon,
        LogoffRequest,
        LogonResult,
        RegResult
    }
}
